package top.blueShark.template.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import top.blueShark.template.entity.SysUser;
import top.blueShark.template.entity.dto.SysUserRequestDTO;

/**
 * 系统用户 Mapper 接口
 */
@Mapper
public interface SysUserMapper {
    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    SysUser findByUsername(@Param("username") String username);

    /**
     * 根据手机号查询用户
     *
     * @param phone 手机号
     * @return 用户信息
     */
    SysUser findByPhone(@Param("phone") String phone);

    /**
     * 插入用户
     *
     * @param user 用户信息
     * @return 影响行数
     */
    int insert(SysUser user);

    /**
     * 查询所有用户
     */
    List<SysUser> selectAll(SysUserRequestDTO sysUserRequestDTO);

    /**
     * 根据ID查询用户
     */
    SysUser selectById(@Param("id") Long id);

    /**
     * 更新用户
     */
    int update(SysUser user);

    /**
     * 删除用户
     */
    int deleteById(@Param("id") Long id);

    // 查询用户的角色ID列表
    List<String> selectRoleIdsByUserId(@Param("userId") Long userId);

    List<String> selectRoleNamesByUserId(@Param("userId") Long userId);
    
    // 新增：根据用户ID获取其关联的所有菜单的权限码 (auth_code)
    List<String> selectAuthCodesByUserId(@Param("userId") Long userId); // <-- 新增此方法

    /**
     * 返回值类型是 Map<K, V>，MyBatis 需要知道用哪个字段作为 Map 的 key。
     * */
    @MapKey("role_id")
    List<Map<String, Object>> selectUserRoles(@Param("userId") Long userId);

    // 删除用户的所有角色
    int deleteUserRoles(@Param("userId") Long userId);

    // 给用户分配角色（批量插入）
    int insertUserRoles(@Param("userId") Long userId, @Param("roleIds") List<String> roleIds);

    /**
     * 查询总用户数
     *
     * @return 总用户数
     */
    long countTotalUsers();
    
}